package com.huatai.bpmn.commom.util;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import org.springframework.util.StringUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

/**
 * String 工具类
 */
public class StrUtilI extends StrUtil {
    /**
     * 判断是否为json格式
     *
     * @param value
     * @return
     */
    public static boolean isJson(String value) {
//        value = StrUtilI.trim(value);
//        if (value.startsWith("{") && value.endsWith("}")) {
//            return true;
//        }
//        if (value.startsWith("[") && value.endsWith("]")) {
//            return true;
//        }
        return JSONObject.isValid(value);
//        return false;
    }

    /**
     * 判断字符串是否为base64编码（正则表达式）
     * <p>
     * 字符串只可能包含A-Z，a-z，0-9，+，/，=字符
     * 字符串长度是4的倍数
     * =只会出现在字符串最后，可能没有或者一个等号或者两个等号
     *
     * @param value
     * @return
     */
    public static boolean isBase64ByPattern(String value) {
        if (isBlank(value)) {
            return false;
        }
        return Pattern.matches("^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$", value);
    }





    /**
     * 获取两串不匹配字符数
     *
     * @param str
     * @param target
     * @return
     */
    private static int compare(String str, String target) {
        int d[][]; // 矩阵
        int n = str.length();
        int m = target.length();
        int i; // 遍历str的
        int j; // 遍历target的
        char ch1; // str的
        char ch2; // target的
        int temp; // 记录相同字符,在某个矩阵位置值的增量,不是0就是1
        if (n == 0) {
            return m;
        }
        if (m == 0) {
            return n;
        }
        d = new int[n + 1][m + 1];
        // 初始化第一列
        for (i = 0; i <= n; i++) {
            d[i][0] = i;
        }
        // 初始化第一行
        for (j = 0; j <= m; j++) {
            d[0][j] = j;
        }
        // 遍历str
        for (i = 1; i <= n; i++) {
            ch1 = str.charAt(i - 1);
            // 去匹配target
            for (j = 1; j <= m; j++) {
                ch2 = target.charAt(j - 1);
                if (ch1 == ch2) {
                    temp = 0;
                } else {
                    temp = 1;
                }

                // 左边+1,上边+1, 左上角+temp取最小
                d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + temp);
            }
        }
        return d[n][m];
    }

    private static int min(int one, int two, int three) {
        return (one = one < two ? one : two) < three ? one : three;
    }

    /**
     * 比较俩个字符串的相似度
     * 步骤1：获取两个串中不相同的字符数
     * 步骤2：不同字符数 除以 较长串的长度
     *
     * @param strA
     * @param strB
     * @return
     */
    public static double projectNameSimilarity(String strA, String strB) {
        return 1 - (double) compare(strA, strB) / Math.max(strA.length(), strB.length());
    }

    /**
     * 正则表达式过滤特殊字符
     *
     * @param str
     * @return
     * @throws PatternSyntaxException
     */
    public static String StringFilter(String str) throws PatternSyntaxException {
        // 只允许字母和数字
        // String   regEx  =  "[^a-zA-Z0-9]";
        // 清除掉所有特殊字符
        //String regEx="[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]";
        //不过滤   .doc的.
        String regEx = "[`~!@#$%^&*()+=|{}':;',\\[\\]<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.replaceAll("").trim();
    }


}
